package com.hthy.futures.api;

import com.hthy.futures.bean.Vhead;


import net.hthy.bean.Quote;

import java.text.DecimalFormat;

/**
   * smartTrade 行情api
   * Author:  Mr.bingley
   * Version:
   * Date:  2017/3/17
   *
   */

public class ST_QuoteApi {
    public static  int K_REQUEST_NUM = 80;   // 默认情况下k线请求的数量
    /**
     * 用户密码校验（0x8b00）
     * 返回 35584
     *
     * @return
     */
    public static byte[] checkLogin() {
        // 拼凑pb 4097
        Quote.UserLoginRequest userLoginRequest = Quote.UserLoginRequest.newBuilder().setSsUsername("1112").setSsPassword("a123456").setUiSoftwareVersion(0x1001).build();
        byte[] bytes2 = userLoginRequest.toByteArray();
        int serializedSize = userLoginRequest.getSerializedSize();

        return getBaseStr("8b00",bytes2,serializedSize);
    }

    /**
     * 市场初始化（0x1000）    ---（价格）
     * @return 4096
     */
    public static byte[] initMarket() {
        return getBaseHead("1000");
    }

    /**
     * 报价表（0x0200）
     * @return
     */
    public static byte[] getOfferSheet() {
        return getBaseHead("0200");
    }


    /**
     * 5. 成交明细（0x0100） TODO
     * 返回 35584
     *
     * @return
     */
    public static byte[] getTransactionDetailData() {
        // 拼凑pb 4097
        Quote.UserLoginRequest userLoginRequest = Quote.UserLoginRequest.newBuilder().setSsUsername("1112").setSsPassword("a123456").setUiSoftwareVersion(0x1001).build();
        byte[] bytes2 = userLoginRequest.toByteArray();
        int serializedSize = userLoginRequest.getSerializedSize();

        return getBaseStr("0100",bytes2,serializedSize);
    }

    /**
     * 历史K线数据（0x0600）
     * int nDataType;
       int nHasNum;//当前已有数量
       int nAskNum;//请求数量
     *
     *
     * nDataType取值：
         0	表明为一分钟线
         1	表明为一分钟线
         5	5分钟K线
         10	10分钟K线
         15	15分钟K线
         30	30分钟K线
         60	60分钟K线
         62	两小时K线
         64	四小时K线
         101	日K线
         102	周K线
         103	月K线
     * @return
     */
    // 每次请求八十个
    public static byte[] getHistotryData(int dataType, int dataIndex, String productCode) {
        // 拼凑pb 4097
        if (productCode != null) {
            Quote.ProductPriceInfo productPriceInfo = Quote.ProductPriceInfo.newBuilder().setSsProductCode(productCode).build();
            Quote.GetHistoryKDataRequest getHistoryKDataRequest = Quote.GetHistoryKDataRequest.newBuilder().setUiKDataType(dataType).setUiKDataIndex(dataIndex).setUiKDataNumber(K_REQUEST_NUM).setProductPriceInfo(productPriceInfo).build();
            byte[] bytes2 = getHistoryKDataRequest.toByteArray();
            int serializedSize = getHistoryKDataRequest.getSerializedSize();
            return getBaseStr("0600",bytes2,serializedSize);
        }
        return new byte[0];
    }


    /**
     *  分时成交（0x1100） TODO  (貌似不用）
     * 返回 35584
     *
     * @return
     */





    /**
     * 只得到报文头
     * @param code
     * @return
     */
    public static byte[] getBaseHead(String code) {
        //把二进制转化为十进制
        // 35584
        String codeStr  = Integer.valueOf(code, 16).toString();

        String str1 = 37 + "";
        DecimalFormat df = new DecimalFormat("00000000");
        String lenth = df.format(Integer.parseInt(str1));
        String phonecode = df.format(Integer.parseInt(codeStr));   // TODO

        Vhead vhead = new Vhead();
        vhead.lenth = lenth;
        vhead.phone = phonecode;

        byte[] bytes1 = vhead.getHead().getBytes();
        return  bytes1;
    }



    /**
     * 报文头+pb文件内容
     * @param code
     * @param bytes
     * @param serializedSize
     * @return
     */
    // 1 把二进制转化为十进制 　Integer.valueOf("1010",2).toString()
    public static byte[] getBaseStr(String code,byte[] bytes,int serializedSize) {
        //把二进制转化为十进制
        // 35584
        String codeStr  = Integer.valueOf(code, 16).toString();

        String str1 = serializedSize + 37 + "";
        DecimalFormat df = new DecimalFormat("00000000");
        String lenth = df.format(Integer.parseInt(str1));
        String phonecode = df.format(Integer.parseInt(codeStr));   // TODO

        Vhead vhead = new Vhead();
        vhead.lenth = lenth;
        vhead.phone = phonecode;

        byte[] bytes1 = vhead.getHead().getBytes();
        return  addBytes(bytes1,bytes);
    }

    /**
     *
     * @param data1
     * @param data2
     * @return data1 与 data2拼接的结果
     */
    public static byte[] addBytes(byte[] data1, byte[] data2) {
        byte[] data3 = new byte[data1.length + data2.length];
        System.arraycopy(data1, 0, data3, 0, data1.length);
        System.arraycopy(data2, 0, data3, data1.length, data2.length);
        return data3;
    }
}
